package com.writing.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.writing.entity.Prompt;
import com.writing.entity.User;
import com.writing.mapper.PromptMapper;
import com.writing.service.PromptService;
import com.writing.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 提示词服务实现类
 */
@Service
@RequiredArgsConstructor
public class PromptServiceImpl extends ServiceImpl<PromptMapper, Prompt> implements PromptService {
    
    private final UserService userService;
    
    @Override
    public List<Prompt> getPromptsByUserId(Long userId, String category) {
        List<Prompt> allPrompts = new ArrayList<>();
        
        // 1. 获取用户自己的提示词
        LambdaQueryWrapper<Prompt> userQueryWrapper = new LambdaQueryWrapper<Prompt>()
                .eq(Prompt::getUserId, userId)
                .orderByDesc(Prompt::getUsageCount)
                .orderByDesc(Prompt::getUpdatedAt);
        
        if (StringUtils.hasText(category)) {
            userQueryWrapper.eq(Prompt::getCategory, category);
        }
        
        List<Prompt> userPrompts = this.list(userQueryWrapper);
        allPrompts.addAll(userPrompts);
        
        // 2. 获取管理员设置的默认提示词（is_default=1 且创建者是管理员）
        List<Long> adminUserIds = userService.list(new LambdaQueryWrapper<User>()
                .eq(User::getRole, "ADMIN"))
                .stream()
                .map(User::getId)
                .collect(Collectors.toList());
        
        if (!adminUserIds.isEmpty()) {
            LambdaQueryWrapper<Prompt> adminQueryWrapper = new LambdaQueryWrapper<Prompt>()
                    .in(Prompt::getUserId, adminUserIds)
                    .eq(Prompt::getIsDefault, 1)
                    .orderByDesc(Prompt::getUsageCount)
                    .orderByDesc(Prompt::getUpdatedAt);
            
            if (StringUtils.hasText(category)) {
                adminQueryWrapper.eq(Prompt::getCategory, category);
            }
            
            List<Prompt> adminDefaultPrompts = this.list(adminQueryWrapper);
            allPrompts.addAll(adminDefaultPrompts);
        }
        
        return allPrompts;
    }
    
    @Override
    public Prompt getPromptById(Long promptId, Long userId) {
        Prompt prompt = this.getById(promptId);
        
        if (prompt == null) {
            return null;
        }
        
        // 如果提示词属于当前用户，直接返回
        if (prompt.getUserId().equals(userId)) {
            return prompt;
        }
        
        // 如果提示词是管理员设置的默认提示词，也允许普通用户查看
        User promptOwner = userService.getById(prompt.getUserId());
        if (promptOwner != null && "ADMIN".equals(promptOwner.getRole()) 
            && prompt.getIsDefault() != null && prompt.getIsDefault() == 1) {
            return prompt;
        }
        
        // 其他情况返回null（无权限）
        return null;
    }
    
    @Override
    public Prompt createPrompt(Prompt prompt) {
        // 设置默认值
        if (prompt.getIsDefault() == null) {
            prompt.setIsDefault(0); // 0表示非默认，1表示默认
        }
        if (prompt.getUsageCount() == null) {
            prompt.setUsageCount(0);
        }
        
        this.save(prompt);
        return prompt;
    }
    
    @Override
    public Prompt updatePrompt(Prompt prompt, Long userId) {
        Prompt existingPrompt = this.getById(prompt.getId());
        
        if (existingPrompt == null) {
            throw new RuntimeException("提示词不存在");
        }
        
        // 检查权限：只有提示词的所有者才能修改
        if (!existingPrompt.getUserId().equals(userId)) {
            throw new RuntimeException("无权限修改此提示词");
        }
        
        // 检查是否是默认提示词（普通用户不能修改默认提示词，无论创建者是谁）
        User currentUser = userService.getById(userId);
        if (currentUser != null && !"ADMIN".equals(currentUser.getRole())) {
            // 普通用户不能修改默认提示词
            if (existingPrompt.getIsDefault() != null && existingPrompt.getIsDefault() == 1) {
                throw new RuntimeException("不能修改默认提示词");
            }
        }
        
        // 保留原有的使用次数和默认状态
        prompt.setUsageCount(existingPrompt.getUsageCount());
        if (prompt.getIsDefault() == null) {
            prompt.setIsDefault(existingPrompt.getIsDefault());
        }
        
        this.updateById(prompt);
        return prompt;
    }
    
    @Override
    public boolean deletePrompt(Long promptId, Long userId) {
        Prompt prompt = this.getById(promptId);
        
        if (prompt == null) {
            throw new RuntimeException("提示词不存在");
        }
        
        // 检查权限：只有提示词的所有者才能删除
        if (!prompt.getUserId().equals(userId)) {
            throw new RuntimeException("无权限删除此提示词");
        }
        
        // 检查是否是默认提示词（普通用户不能删除默认提示词，无论创建者是谁）
        User currentUser = userService.getById(userId);
        if (currentUser != null && !"ADMIN".equals(currentUser.getRole())) {
            // 普通用户不能删除默认提示词
            if (prompt.getIsDefault() != null && prompt.getIsDefault() == 1) {
                throw new RuntimeException("不能删除默认提示词");
            }
        }
        
        return this.removeById(promptId);
    }
    
    @Override
    public void incrementUsageCount(Long promptId, Long userId) {
        Prompt prompt = this.getById(promptId);
        
        if (prompt == null) {
            throw new RuntimeException("提示词不存在");
        }
        
        // 允许用户使用自己的提示词或管理员设置的默认提示词
        boolean canUse = false;
        
        // 1. 提示词属于当前用户
        if (prompt.getUserId().equals(userId)) {
            canUse = true;
        }
        // 2. 提示词是管理员设置的默认提示词
        else {
            User promptOwner = userService.getById(prompt.getUserId());
            if (promptOwner != null && "ADMIN".equals(promptOwner.getRole()) 
                && prompt.getIsDefault() != null && prompt.getIsDefault() == 1) {
                canUse = true;
            }
        }
        
        if (!canUse) {
            throw new RuntimeException("无权限使用此提示词");
        }
        
        // 增加使用次数
        prompt.setUsageCount(prompt.getUsageCount() + 1);
        this.updateById(prompt);
    }
    
    @Override
    public void initDefaultPrompts(Long userId) {
        // 该方法已废弃，不再为每个用户复制提示词
        // 现在默认提示词由管理员在后台设置，所有用户都可以看到和使用
        // 保留此方法是为了兼容性，不做任何操作
        return;
    }

    @Override
    public List<Prompt> getDefaultPrompts() {
        // 从数据库查询管理员设置的默认提示词
        // 获取所有管理员用户ID
        List<Long> adminUserIds = userService.list(new LambdaQueryWrapper<User>()
                .eq(User::getRole, "ADMIN"))
                .stream()
                .map(User::getId)
                .collect(Collectors.toList());
        
        if (adminUserIds.isEmpty()) {
            return new ArrayList<>();
        }
        
        // 查询管理员创建的默认提示词（is_default=1）
        LambdaQueryWrapper<Prompt> queryWrapper = new LambdaQueryWrapper<Prompt>()
                .in(Prompt::getUserId, adminUserIds)
                .eq(Prompt::getIsDefault, 1)
                .orderByDesc(Prompt::getUsageCount)
                .orderByDesc(Prompt::getUpdatedAt);
        
        return this.list(queryWrapper);
    }
}
